/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Dao;

import Pojo.Disciplina;
import Pojo.Professor;
import Pojo.Turma;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

/**
 *
 * @author maione
 */
public class TurmaDaoImplJPA implements TurmaDao{
        /**
	 * Adicionar uma Turma ao banco de dados de Turmas
	 * @param turma
	 * @return true ou false indicando sucesso ou não
	 */
	public boolean inserir(Turma turma){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                em.persist(turma);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
        }
        
         /**
	 * Remover Turma do banco ce dados de Turmas
	 * @param turma
	 * @return true ou false indicando sucesso ou não
	 */
	public boolean remover(Turma turma){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                Turma turmaAux = em.find(Turma.class, turma.getId());
                em.remove(turmaAux);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
        }
        
         /**
	 * alterar Turma do banco de dados de Turmas
	 * @param turma
	 * @return true ou false indicando sucesso ou não
	 */
         public boolean alterar(Turma turma){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                em.merge(turma);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
         }
                  
        /**
        * Pesquisar turmas lecionadas por um professor
        * @param professor
        * @return 
        */
        public List<Turma> pesquisarPorProfessor(Professor professor){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<Turma> listaTurmas = null;
            try{
                tx.begin();
                Query query = em.createQuery("select t from Turma t where t.professor = :professor");
                query.setParameter("professor", professor);
                listaTurmas = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(listaTurmas);
        }
        
        /**
        * Pesquisar turmas passando professor, o ano e o período
        * @param professor
        * @param ano
        * @param periodo
        * @return 
        */
        public List<Turma> pesquisarPorDisciplinaAnoPeriodo(Disciplina disciplina, int ano, int periodo){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<Turma> listaTurmas = null;
            try{
                tx.begin();
                Query query = em.createQuery("select t from Turma t where t.disciplina = :disciplina and t.ano = :ano and t.periodo = :periodo");
                query.setParameter("disciplina", disciplina);
                query.setParameter("ano", ano);
                query.setParameter("periodo", periodo);
                listaTurmas = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(listaTurmas);           
        }
        
        /**
        * Pesquisar turmas passando disciplina
        * @param disciplina
        * @param ano
        * @param periodo
        * @return 
        */
       public List<Turma> pesquisarPorDisciplina(Disciplina disciplina){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<Turma> listaTurmas = null;
            try{
                tx.begin();
                Query query = em.createQuery("select t from Turma t where t.disciplina = :disciplina");
                query.setParameter("disciplina", disciplina);
                listaTurmas = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(listaTurmas);
       }
        
       
        /**
        * Pesquisar turmas abertas.
        * @param turma
        * @return 
        */
       public List<Turma> pesquisarTurmasAbertas(){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<Turma> listaTurmas = null;
            try{
                tx.begin();
                Query query = em.createQuery("select t from Turma t where t.finalizada = :finalizada ");
                query.setParameter("finalizada", false);
                listaTurmas = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(listaTurmas);
       }
       
       /**
        * Pesquisar turmas passando o id
        * @param id
        * @return 
        */
        public Turma pesquisarPorId(int id){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            Turma turma = null;
            try{
                tx.begin();
                Query query = em.createQuery("select t from Turma t where t.id = :id ");
                query.setParameter("id", id);
                turma = (Turma) query.getSingleResult();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(turma);
        }
}
